package com.egao.common.module.student.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.egao.common.core.web.JsonResult;
import com.egao.common.core.web.PageParam;
import com.egao.common.core.web.PageResult;
import com.egao.common.module.home.entity.HomeData;
import com.egao.common.module.student.entity.Student;
import com.egao.common.module.student.entity.StudentSign;
import com.egao.common.module.student.entity.vo.*;
import com.egao.common.module.system.entity.College;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 学生签约毕业去向接口
 *
 * @author lym
 */
public interface StudentSignService extends IService<StudentSign> {

    /**
     * 查询分页学生签约列表
     * 信息有效性升序,邀请签约时间倒序
     * company参数有任意值,查询companyId不等于空的数据
     * @param pageParam 含登录人信息 分页信息
     * @return PageResult<StudentSignListVO>
     */
    PageResult<StudentSignListVO> listPage(PageParam<StudentSign> pageParam);

    /**
     * 查询当前登录学生有效签约记录
     * 信息有效性升序 邀请签约时间倒序
     *
     * @param loginUserId 登录人
     * @return List<StudentSignListVO>
     */
    List<StudentSignListVO> listAll(Integer loginUserId);

    /**
     * 查询单个有效信息
     * @param loginUserId 登录人ID
     * @return StudentSign
     */
    StudentSign getStateValid(Integer loginUserId);

    /**
     * 查询登录人就业方式 、网签或非网签
     * @param loginUserId 登录人ID
     * @return data 就业方式 没有就业方式为00
     */
    JsonResult getSignCategory(Integer loginUserId);

    /**
     * 查询单个表单或详情对象
     * 邀约信息使用主键查询 否则 使用登陆人ID查询
     * @param id 主键ID
     * @param loginUserId 登陆人ID
     * @param collegeBtn 学院审核按钮显示状态 true显示 false不显示
     * @param userType 用户类型
     * @return StudentSign
     */
    JsonResult detail(Integer id, Integer loginUserId, boolean collegeBtn, String userType);

    /**
     * 选择就业方式
     * 只控制自主录入,包括协议就业
     * 单位邀约是另外接口应约形成就业方式
     * @param signCategory 就业方式
     * @param loginUserId  登录人ID
     * @return JsonResult
     */
    JsonResult pickSignCategory(String signCategory, Integer loginUserId);

    /**
     * 重置就业方式
     *
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult resetSignCategory(Integer loginUserId);

    /**
     * 选择 录用方式(毕业去向分类)
     * @param studentSign 表单对象 含就业方式等
     * @param loginUserId 用户ID
     * @return JsonResult
     */
    JsonResult pickDispatchHiredWay(StudentSign studentSign, Integer loginUserId);

    /**
     * 提交毕业去向登记
     * @param studentSign 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult submit(StudentSign studentSign, Integer loginUserId);

    /**
     * 提交备案协议
     * 更改签约状态
     * @param studentSign 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult submitRecord(StudentSign studentSign, Integer loginUserId);

    /**
     * 管理端学生毕业去向列表
     * 从学生表出发，一个学生一条数据，就算没有签约信息也有一条数据
     * @param pageParam PageParam<StudentSignAdminListVO>
     * @return PageResult<StudentSignAdminListVO>
     */
    PageResult<StudentSignAdminListVO> listAdminPage(PageParam<StudentSignAdminListVO> pageParam);

    /**
     * 学院修改提交
     * 不修改审核状态
     * @param studentSign 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult editForCollege(StudentSign studentSign, Integer loginUserId);

    /**
     * 学院审核提交
     * @param studentSign 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult submitForCollege(StudentSign studentSign, Integer loginUserId);

    /**
     * 学校修改毕业去向
     * @param studentSign 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult submitForSchool(StudentSign studentSign, Integer loginUserId);

    /**
     * 毕业去向人数
     * @param noPageParam Map<String, Object>
     * @return pageParam
     */
    JsonResult countAdmin(Map<String, Object> noPageParam);

    /**
     * 单位管理 学生签约分页列表
     * @param pageParam 参数对象 单位ID等
     * @return PageResult<StudentSignCompanyListVO>
     */
    PageResult<StudentSignCompanyListVO> listCompanyPage(PageParam<StudentSignCompanyListVO> pageParam);

    /**
     * 单位邀约表单
     * @param loginUserId
     * @return
     */
    JsonResult companySignForm(Integer loginUserId);

    /**
     * 单位选择 录用方式(毕业去向分类)
     * @param studentSign 表单对象 含就业方式等
     * @param loginUserId 用户ID
     * @return JsonResult
     */
    JsonResult companyPickDispatchHiredWay(StudentSign studentSign, Integer loginUserId);

    /**
     * 邀约查询学生
     * @param xh 学生学号
     * @param loginUserId 单位登录人用户ID
     * @return 0可以邀约 1不可邀约
     */
    JsonResult searchStudent(String xh, Integer loginUserId);

    /**
     * 单位邀约 修改邀约
     * @param studentSign 表单对象
     * @param loginUserId 单位登录人ID
     * @return JsonResult
     */
    JsonResult submitForCompany(StudentSign studentSign, Integer loginUserId);

    /**
     * 应约
     * @param studentSign 毕业去向ID
     * @param loginUserId 学生登录人用户ID
     * @return 0应约成功 1应约失败
     */
    JsonResult agreedSign(StudentSign studentSign, Integer loginUserId);

    /**
     * 申请解约
     * 应届毕业生需要验证签约设置条件
     * 往届毕业生不需要验证签约设置条件
     * @param studentSign studentSign
     * @param loginUserId 登录人用户ID
     * @return 0解约成功 1解约失败
     */
    JsonResult termination(StudentSign studentSign, Integer loginUserId);

    /**
     * 解约再签约解冻日期
     * @param loginUserId 登录人用户ID
     * @return 0没有或过期可以签约 1有未来的解冻日期不可签约
     */
    JsonResult terminationFrozenDay(Integer loginUserId);

    /**
     * 申请改派
     * @param studentSign studentSign
     * @return JsonResult
     */
    JsonResult dispatch(StudentSign studentSign);

    /**
     * 关闭消息提示
     * @param studentSignId 学生毕业去向主键ID
     */
    void closeMsg(Integer studentSignId);

    /**
     * 导出毕业去向数据
     * @param pageParam 参数
     * @param response HttpServletResponse
     * @return response 响应下载文件
     */
    void exportStudentSign(PageParam<StudentSignAdminListVO> pageParam, HttpServletResponse response);

    /**
     * 协议就业打印表详情
     * 主键不为NULL根据主键查询否则根据登陆人查询
     * @param id 主键ID
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult dealPrint(Integer id, Integer loginUserId);

    /**
     * 灵活就业打印表详情
     * 主键不为NULL根据主键查询否则根据登陆人查询
     * @param id 主键ID
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult agilePrint(Integer id, Integer loginUserId);

    /**
     * 自由职业打印表详情
     * 主键不为NULL根据主键查询否则根据登陆人查询
     * @param id 主键ID
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult freePrint(Integer id, Integer loginUserId);

    /**
     * 自主创业打印表详情
     * 主键不为NULL根据主键查询否则根据登陆人查询
     * @param id 主键ID
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult venturePrint(Integer id, Integer loginUserId);

    /**
     * 设置扩展项
     * @param studentSign 毕业去向信息
     * @param student 学生信息
     */
    void setExt(StudentSign studentSign, Student student);

    /**
     * 签约统计
     * @param studentSignStatistics StudentSignStatistics
     * @return json
     */
    JsonResult signStatistics(StudentSignStatistics studentSignStatistics);

    /**
     * 所有学院签约统计
     * @param studentSignStatistics StudentSignStatistics
     * @return json
     */
    JsonResult allSignStatistics(StudentSignStatistics studentSignStatistics, List<College> colleges);

    /**
     * 查询homeData数据
     * @param yearId 毕业年份
     * @return HomeData
     */
    HomeData homeData(Integer yearId);

    /**
     * 验证单位是否可以查看签约信息
     * 避免单位查看到非本单位签约的签约信息
     * @param id 主键ID
     * @param loginUserId 登录人ID
     * @return code=0 可见 code=1 不可见
     */
    JsonResult verifyCompanyView(Integer id, Integer loginUserId);

    /**
     * 学院重置就业方式
     * 学院只能够重置非协议就业
     * @param id 毕业去向ID
     * @param loginUserId 登录人
     * @return JsonResult code=0成功 1失败
     */
    JsonResult resetSignCategoryByCollege(Integer id, Integer loginUserId);

    /**
     * 学校重置就业方式
     * @param id 毕业去向ID
     * @param loginUserId 登录人
     * @return JsonResult code=0成功 1失败
     */
    JsonResult resetSignCategoryBySchool(Integer id, Integer loginUserId);

    /**
     * 空白协议重置就业方式
     * @param studentSign 毕业去向信息
     * @param loginUserId 登录人
     * @return JsonResult code=0成功 1失败
     */
    void resetSignCategoryByBlank(StudentSign studentSign, Integer loginUserId);

    /**
     * 查询签约记录
     * @param pageParam
     * @return
     */
    PageResult<StudentSignRecordVO> listSignRecord(PageParam<StudentSignRecordVO> pageParam);

    /**
     * 网签校友使用数据分页查询
     * @param pageParam
     * @return
     */
    PageResult<StudentSignAlumniVO> listAlumniPage(PageParam<StudentSign> pageParam);

    /**
     * 在指定学生范围内
     * 筛选已完成毕业去向登记或待就业学生
     * @param studentList
     * @return
     */
    List<Student> screenStudentSign(List<Student> studentList);

    /**
     * 查询各学院完成签约(登记)人数
     * 必须是有效且已完成的签约(登记)
     * 就业方式不包含待就业
     * 不算定向生
     * @param yearId 毕业年份
     * @param xl 复数学历
     * @param tks 特困生
     * @return
     */
    List<StudentSignStatisticsCollegeVO> collegeStudentSignCount(Integer yearId, String xl, String tks, String date1, String date2);

    /**
     * 查询各专业完成签约(登记)人数
     * 必须是有效且已完成的签约(登记)
     * 就业方式不包含待就业
     * 不算定向生
     * @param yearId 毕业年份
     * @param xl 复数学历
     * @return
     */
    List<StudentSignStatisticsCollegeVO> majorStudentSignCount(Integer yearId, String xl);

    /**
     * 查询各民族签约人数
     * 排除汉族
     * @param yearId 毕业年份
     * @param xl 学历
     * @param tks 特困生
     * @return
     */
    List<StudentSignStatisticsCollegeVO> mzStudentSignCount(Integer yearId, String xl, String tks);

    /**
     * 查询个类型签约登记人数
     * @param yearId 学生毕业年份
     * @return StudentSignStatisticsCollegeVO
     */
    StudentSignStatisticsCollegeVO signCount(Integer yearId);

    /**
     * 查询已确认毕业去向学院及学院人数
     * @param yearId 毕业年份ID
     * @return List<StudentSignConfirmVO>
     */
    List<StudentSignConfirmVO> studentSignConfirmList(Integer yearId);

    /**
     * 导入档案转递编号
     * @param file excel
     * @return JsonResult
     */
    JsonResult importNumber(MultipartFile file);

    List<StudentSign> tempList();

    /**
     * 毕业去向大屏数据源
     * @param year 学生毕业年份
     * @return List<StudentSign>
     */
    List<StudentSign> listBigData(Integer year);

    /**
     * 决定是否同意单位修改协议内容
     * @param studentSignEditId 毕业去向修改对象ID
     * @param state 是否同意修改 0同意 1不同意
     * @param userId 操作用户ID
     * @return JsonResult
     */
    JsonResult choiceCompanyEdit(Integer studentSignEditId, Integer state, Integer userId);

    /**
     * 初始化一个毕业去向编号
     * @return
     */
    String initSerialNumber();
}
